package mysql8学习.初级.第12章_MySQL数据类型精讲;

public class G1_CHAR和vVARCHAR {
}
/**
 * CHAR(M) 和 VARCHAR(M)
 * | 字符串(文本)类型    | 特点        | 长度  | 长度范围         | 占用的存储空间        |
 * | ---------------- | --------    | ---- | --------------- | --------------------- |
 * | CHAR(M)          | 固定长度      | M    | 0 <= M <= 255   | M个字节               |
 * | VARCHAR(M)       | 可变长度      | M    | 0 <= M <= 65535| (实际长度 + 1) 个字节 |
 *                                          (其实最大其实是21845)  +1表示那个字节表示字符占用了多少字符
 *
 * CHAR类型：
 *      ● CHAR(M) 类型一般需要预先定义字符串长度。如果不指定(M)，则表示长度默认是1个字符。
 *      ● 如果保存时，数据的实际长度比CHAR类型声明的长度小，则会在 右侧填充 空格以达到指定的长度。
 *          当MySQL检索CHAR类型的数据时，CHAR类型的字段会去除尾部的空格。
 *      ● 定义CHAR类型字段时，声明的字段长度即为CHAR类型字段所占的存储空间的字节数
 *
 * VARCHAR类型：
 * ● VARCHAR(M) 定义时， 必须指定 长度M，否则报错。
 * ● MySQL4.0版本以下，varchar(20)：
 *      指的是20字节，如果存放UTF8汉字时，只能存6个（每个汉字3字节） ；
 *      MySQL5.0版本以上，varchar(20)：指的是20字符。
 * ● 检索VARCHAR类型的字段数据时，会保留数据尾部的空格。
 *      VARCHAR类型的字段所占用的存储空间为字符串实际长度加1个字节。
 *
 *
 * | 类型       | 特点      | 空间上         | 时间上   | 适用场景             |
 * | ---------- | -------- | ------------ | ------ | -------------------- |
 * | CHAR(M)    | 固定长度  | 浪费存储空间     | 效率高  | 存储不大，速度要求高   |
 * | VARCHAR(M) | 可变长度  | 节省存储空间     | 效率低   | 非CHAR的情况         |
 *
 *  VARCHAR(M)  必须写M  0 <= M <= 65535(其实最大其实是16845)   因为 汉字最多3字节
 *  情况1：存储很短的信息。比如门牌号码101，201……这样很短的信息应该用char，
 *         因为varchar还要占个byte用于存储信息长度，本来打算节约存储的，结果得不偿失。
 * 情况2：固定长度的。比如使用uuid作为主键，那用char应该更合适。
 *       因为他固定长度，varchar动态根据长度的特性就消失了，而且还要占个长度信息。
 * 情况3：十分频繁改变的column。因为varchar每次存储都要有额外的计算，得到长度等工作，
 *      如果一个非常频繁改变的，那就要有很多的精力用于计算，而这些对于char来说是不需要的。
 * 情况4：具体存储引擎中的情况：
 *      ● MyISAM 数据存储引擎和数据列：
 *          MyISAM数据表，最好使用固定长度(CHAR)的数据列代替可变长度(VARCHAR)的数据列。
 *          这样使得整个表静态化，从而使 数据检索更快 ，用空间换时间。
 *      ● MEMORY 存储引擎和数据列：MEMORY数据表目前都使用固定长度的数据行存储，
 *          因此无论使用CHAR或VARCHAR列都没有关系，两者都是作为CHAR类型处理的。
 *      ● InnoDB 存储引擎，建议使用 VARCHAR 类型。
 *          因为对于InnoDB数据表，内部的行存储格式并没有区分固定长度和可变长度列
 *          （所有数据行都使用指向数据列值的头指针），
 *          而且主要影响性能的因素是数据行使用的存储总量，由于char平均占用的空间多于varchar，
 *          所以除了简短并且固定长度的，其他考虑varchar。这样节省空间，对磁盘I/O和数据存储总量比较好。
 *
 * VARCHAR  超过字符会报错
 *  5.7    存储的时候 会自动补空格  但是返回的时候  他自动把空格过滤了  包括自己添加的空格
 *
 */
